package com.itheima.service.impl;

import com.itheima.mapper.MemberMapper;
import com.itheima.pojo.Member;
import com.itheima.service.MemberService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Transactional
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberMapper memberMapper;

    @Override
    public Member findMemberByTelephone(String telephone) {
        return memberMapper.findMemberByTelephone(telephone);
    }

    @Override
    public void addMember(Member member) {
        memberMapper.addMember(member);
    }

    @Override
    public Map getMemberReport() {
        //获取日历对象
        Calendar calendar = Calendar.getInstance();

        //设置日历往前推12个月
        calendar.add(Calendar.MONTH, -12);

        //定义一个list集合，存放过去12个月每个月的月份
        List<String> months = new ArrayList<>();

        //定义一个list集合，存放过去12个月每个月的会员数量
        List<Integer> memberCounts = new ArrayList<>();

        //遍历过去12个月的每一个月
        for (int i = 0; i < 12; i++) {

            //获取每个月的时间
            Date time = calendar.getTime();
            //获取每个月的月份
            String month = new SimpleDateFormat("yyyy-MM").format(time);

            //定义每个月开始日期
            String monthBegin = month + "-1";
            //定义每个月结束时间
            String monthEnd = month + "-31";

            //统计每个月人数
            int count = memberMapper.findMemberCountByMonth(monthBegin, monthEnd);

            //添加每一个月
            months.add(month);

            //添加每一个月的会员数量
            memberCounts.add(count);

            //每次循环都在日历的月份上+1，如-11月,-10月，-9月，依次类推
            calendar.add(Calendar.MONTH, +1);

        }

        //创建一个map，将月份的集合以及每个月会员数量的集合存入其中
        Map<String, List> map = new HashMap<>();
        map.put("months", months);
        map.put("memberCounts", memberCounts);
        return map;
    }

    //通过sex制作饼状图
    @Override
    public List<Map<String, String>> getMemberBySex() {
        List<Map<String, String>> mapList = memberMapper.getMemberBySex();
        for (Map<String, String> map : mapList) {
            System.out.println(map);
            String name = map.get("name");
            //将数据库查询的 1(男) 2(女) 键替换成 '男 女' 用于饼状图显示
            if (name.equals("1")) {
                map.remove("name");
                map.put("name", "男");
            } else {
                map.remove("name");
                map.put("name", "女");
            }
        }
        return mapList;
    }

    //通过age制作饼状图
    @Override
    public List<Map> getMemberByAge() {
        List<Map> mapList = new ArrayList<>();
        //查询0-18岁
        Map map = memberMapper.findMemberByAge(0, 18);
        map.put("name", "0-18");
        mapList.add(map);
        //查询18-30岁
        Map map1 = memberMapper.findMemberByAge(18, 30);
        map1.put("name", "18-30");
        mapList.add(map1);
        //查询30-45岁
        Map map2 = memberMapper.findMemberByAge(30, 45);
        map2.put("name", "30-45");
        mapList.add(map2);
        System.out.println(mapList);
        //查询45岁以上`
        Map map3 = memberMapper.findMemberByAgeMax(45);
        map3.put("name", "45以上");
        mapList.add(map3);

        return mapList;
    }

    //通过查询开始结束日期制作折行图
    @Override
    public Map getMemberByDate(String beginDate, String endDate) {
        //用于存放每个日期段的会员数量
        List<Integer> countList = new ArrayList<>();
        //数组:用于存放开始时间到结束时间的所有年月
        List<String> dataList = new ArrayList<>();
        //定义起始日期bai
        Date d1 = null;
        //定义结束日期
        Date d2 = null;
        try {
            d1 = new SimpleDateFormat("yyyy-MM").parse(beginDate);

            d2 = new SimpleDateFormat("yyyy-MM").parse(endDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //定义日期实例
        Calendar dd = Calendar.getInstance();
        //设置日期起始时间
        dd.setTime(d1);
        //判断是否到结束日期
        while (dd.getTime().before(d2)||dd.getTime().equals(d2)) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
            //获得日期字符串
            String str = sdf.format(dd.getTime());
            //将得到的日期加入到日期数组
            dataList.add(str);
            //进行当前日期月份加1
            dd.add(Calendar.MONTH, 1);
            //拼接格式 用于数据库查询
            String beginDate1 = str + "-01";
            String endDate1 = str + "-31";
            //根据条件查询数据库
            int count = memberMapper.getMemberByDate(beginDate1, endDate1);
            //将查询到的数量添加到数组
            countList.add(count);
        }
            //创建map 存放以上list 用于前端显示
            HashMap map = new HashMap();
            map.put("memberSum", countList);
            map.put("yearAndMonth", dataList);
            return map;
        }
}
